<?php


class MySQL
{
    private static $db = null;
    //私有数据库配置信息
    //私有数据库配置信息
    private $db_host = "127.0.0.1";//主机名
    private $db_user = "root";//用户名
    private $db_pass = "root";//密码
//    private $db_pass = "shuaichao117";//密码
    private $db_name = "wx_test";//数据库名
//    private $db_name = "questionnaire";//数据库名
    private $charset = "utf8";//字符集
    private $link;//数据库连接对象

    //构造方法
    private function __construct(){
        $this->connectDB();//连接数据库
        $this->selectDb();//选择数据库
        $this->setCharset();//设置字符集
    }

    //连接数据库
    private function connectDb(){
        if(!$this->link = @mysqli_connect($this->db_host,$this->db_user,$this->db_pass)){
            die("连接MySQL数据库服务器失败！");
        }
    }

    //选择数据库
    private function selectDb(){
        if(!mysqli_select_db($this->link,$this->db_name)){
            die("选择数据库失败");
        }
    }

    //设置字符集
    private function setCharset(){
        mysqli_set_charset($this->link,$this->charset);
    }

    //私有的克隆方法
    private function __clone(){}
    //公共的静态创建对象方法
    public static function getInstance(){
        //判断当前对象是否存在
        if(!self::$db instanceof self){
            //如果对象不存在则创建对象
            self::$db = new self();
        }
        //存在则返回对象
        return self::$db;
    }


    //公共执行sql语句方法
    public function exec($sql){
        //对sql语句进行大小写转换
        $sql = strtolower($sql);

        //判断是否为SELECT语句
        if(substr($sql,0,6)=='select'){
            die("该方法不能执行SELECT语句，请选择query()方法执行");
        }

        //返回执行结果值
        return mysqli_query($this->link,$sql);
    }

    //私有查询语句
    private function query($sql){
        //对sql语句进行大小写转换
        $sql = strtolower($sql);

        //判断是否为SELECT语句
        if(substr($sql,0,6)!='select'){
            die("该方法只能执行SELECT语句");
        }

        //返回执行结果值
        return mysqli_query($this->link,$sql);
    }

    //查询单条数据

    /**
     * @param $sql
     * @param int $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH
     */
    public function fetchOne($sql,$type=1){
        //获取查询结果值
        $result =  $this->query($sql);
        //判断查询结果类型
        switch ($type){
            case 1:
                $type = MYSQLI_NUM;
                break;
            case 2:
                $type = MYSQLI_ASSOC;
                break;
            default:
                $type = MYSQLI_BOTH;
        }

        return mysqli_fetch_array($result,$type);
    }

    //查询多行数据

    /**
     * @param $sql
     * @param int $type $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH
     * @return array|null
     */
    public function fetchAll($sql,$type=1){
        //获取查询结果值
        $result =  $this->query($sql);
        //判断查询结果类型
        switch ($type){
            case 1:
                $type = MYSQLI_NUM;
                break;
            case 2:
                $type = MYSQLI_ASSOC;
                break;
            default:
                $type = MYSQLI_BOTH;
        }
        return mysqli_fetch_all($result,$type);
    }

    //查询结果记录数
    public function rowCount($sql){
        //执行sql获取结果集
        $result = $this->query($sql);
        //返回结果记录数
        return mysqli_num_rows($result);
    }

    //防止直接输出对象
    public function __toString(){
        return "对象不能直接输出";
    }

    //防止对象当函数调用
    public function __invoke(){
        echo  "对象不能当函数使用";
    }

    //关闭数据库连接
    public function __destruct(){
        mysqli_close($this->link);
    }
}
